using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Sun_Asteroids
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D sun;
        Texture2D ship;
        Vector2 ship_position = new Vector2(200, 200);
        float ship_rotation = 0.0F;
        Vector2 velocity = new Vector2(0, 0);
        Vector2 sun_position = new Vector2(100, 100);
        SpriteFont Font1;
        Boolean gameOver = false;
        

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            sun = this.Content.Load<Texture2D>("Sun");
            ship = this.Content.Load<Texture2D>("Ship");

            // Create a new SpriteBatch, which can be used to draw textures.
            Font1 = Content.Load<SpriteFont>("Courier New");


            // TODO: use this.Content to load your game content here
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;

            KeyboardState k = Keyboard.GetState();

            if (k.IsKeyDown(Keys.Up))
            {
                //Accelerate forward


                Vector2 unitVector =
                    new Vector2(
                    (float)Math.Cos(ship_rotation),
                    (float)Math.Sin(ship_rotation)
                    );


                velocity += 100 * elapsedSeconds * unitVector;

            }

            if (k.IsKeyDown(Keys.Left))
            {
                ship_rotation -= elapsedSeconds;
            }

            if (k.IsKeyDown(Keys.Right))
            {
                ship_rotation += elapsedSeconds;
            }


            //Acceleration towards sun
            {
                velocity += 1000 * elapsedSeconds * Vector2.Normalize(sun_position - ship_position)
                    / Vector2.Distance(sun_position,ship_position);
            }

            

            //"Collision" with sun, within a small radius, stops velocity
            if (Vector2.Distance(sun_position, ship_position) <= 10)
            {
                velocity = Vector2.Zero;
                gameOver = true;
            }

            ship_position += velocity * elapsedSeconds;

            //Wrap ship position
            //if(ship_position >= 


            base.Update(gameTime);
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            Vector2 offset_sun = new Vector2(sun.Width/2,
                                            sun.Height/2);

            Vector2 offset_ship = new Vector2(ship.Width/2, ship.Height/2);

            spriteBatch.Begin();
            spriteBatch.Draw(sun, sun_position-offset_sun, Color.White);
            spriteBatch.Draw(ship, ship_position, null, Color.White, ship_rotation, offset_ship, 1.0F, SpriteEffects.None, 0);
            spriteBatch.End();

            //Game over text
            if (gameOver)
            {
                spriteBatch.Begin();

                // Draw Hello World
                string output = "Game Over!";

                // Find the center of the string
                Vector2 FontOrigin = Font1.MeasureString(output) / 2;
                // Draw the string
                spriteBatch.DrawString(Font1, output, new Vector2(400,200), Color.LightGreen,
                    0, FontOrigin, 7.0f, SpriteEffects.None, 0.5f);

                spriteBatch.End();
            }


            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }
    }
}
